package com.xzx.annotation.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author xinzhixuan
 * @version 1.0
 * @date 2025/4/21 17:07
 */
@Slf4j
@Aspect
@Component
public class MyAspect {

    // 切点,把相同的写入点抽取出来
    @Pointcut("execution(* com.xzx.annotation.aop.MathCalculate.*(..))")
    public void pointCut() {
    }

    // 前置通知：方法执行前执行
    @Before("pointCut()")
    public void before() {
        log.info("前置通知");
    }

    // 后置通知：方法执行完成后执行，不管是否有异常
    @After("pointCut()")
    public void after() {
        log.info("后置通知");
    }

    // 返回通知：方法正常执行完毕时执行
    @AfterReturning("pointCut()")
    public void afterReturning() {
        log.info("返回通知");
    }

    // 异常通知：方法执行过程中发生异常时执行
    @AfterThrowing("pointCut()")
    public void afterThrowing() {
        log.info("异常通知");
    }

    // 环绕通知：方法执行前和执行后都执行
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("环绕通知开始");
        Object proceed = joinPoint.proceed();
        log.info("环绕通知结束");
        return proceed;
    }
}
